/*
XPTracker - Alternative Agile Tracking Tool
Copyright (C) 2006-2009  Stephen Starkey

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
*/
package org.xptracker.search;

import com.google.inject.Inject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xptracker.domain.Domain;
import org.xptracker.domain.Story;
import org.xptracker.domain.WikiPage;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class IndexRebuilder implements Runnable {
  private static final ExecutorService REBUILDERS = Executors.newFixedThreadPool(1);

  private Domain domain;
  private StoryIndexer indexer;

  @Inject
  public IndexRebuilder(Domain domain, StoryIndexer indexer) {
    this.domain = domain;
    this.indexer = indexer;
  }

  public void run() {
    Log log = LogFactory.getLog(getClass());
    try {
      indexer.clearIndex();
      log.info("** Starting story index rebuild...");
      List<Story> stories = domain.listStories();
      long numIndexed = 0;
      for (Story story : stories) {
        indexer.add(domain.fetchStory(story.getId()));
        numIndexed++;
        if (numIndexed > 0 && numIndexed % 100 == 0) {
          indexer.commit();
          log.info("  * Written: " + numIndexed);
        }
      }
      indexer.commit();
      log.info("** Story rebuild complete.  Total written: " + numIndexed);

      log.info("** Starting wiki page index rebuild...");

      List<WikiPage> wikiPages = domain.listWikiPages();
      numIndexed = 0;
      for (WikiPage wikiPage : wikiPages) {
        indexer.add(wikiPage);
        numIndexed++;
        if (numIndexed > 0 && numIndexed % 100 == 0) {
          indexer.commit();
          log.info("  * Written: " + numIndexed);
        }
      }
      indexer.commit();
      log.info("** Wiki page rebuild complete.  Total written: " + numIndexed);
    } catch (Throwable e) {
      log.error("Unable to rebuild index", e);
    }
  }

  public void start() {
    REBUILDERS.submit(this);
  }
}
